//
// Created by LiuYou on 2021/12/9.
//

#include <iostream>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>


static int fd;


int main(int argc, char** argv) {
    if (argc < 2) {
        fprintf( stderr, "用法: %s filename\n", basename( argv[0] ));
        return 1;
    }

    fd = open( argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0600 );
    if (fd < 0) {
        perror( "open(): " );
        return 1;
    }
    atexit( [] {
        close( fd );
    } );

    // 创建一个 5G 大小的空洞文件。
    // todo 笔记: 注意: 这里的 LL 的使用！
    //  没有 单位 是没有意义的。如果没有 LL 就是 int 溢出,
    //  而有 LL 即为 long long 类型, 不会溢出。
//    lseek( fd, /*5G*/5 * 1024 * 1024 * 1024, SEEK_SET );
    lseek( fd, /*5G*/5LL * 1024LL * 1024LL * 1024LL, SEEK_SET );
    /* 对返回值进行判断。 */

    write( fd, "", 1 );

    // cp 是支持空洞文件拷贝的。

    /*
     * windows采用的是文件的size是多少, 相当于在磁盘上占多大的容量。
     * 在unix/linux中不是这样的, 文件的size, 仅仅只是文件的一个属性而已,
     * 而在磁盘上占多大的容量跟stat结构体中的 st_blocks 和 st_blksize
     * 有关。
     */



    return 0;
}
